#include <iostream>
#include <unistd.h>
// #include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
// #include <cstdio>
// #include <cstring>
#include <signal.h>
#include <ctime>
using namespace std;

// void handler(int signo)
// {
//     pid_t rid;
//     //当收到一次17号信号时，在这期间其实又有子进程退出，也能通过waitpid非阻塞回收
//     //从而解决了此时信号信号屏蔽字带来的问题
//     while((rid = waitpid(-1, nullptr, WNOHANG)) > 0)
//     {
//         cout << "wait child success: " << rid << endl;
//     }
// }
int main()
{
    signal(17, SIG_IGN);
    srand(time(nullptr));
    for(int i = 0; i < 10; ++i)
    {
        pid_t id = fork();
        if(id == 0)
        {
            //模拟不同子进程再不同的时间退出
            sleep(rand() % 5 + 3);
            cout << "i am child process, pid: " << getpid() << " ppid: " << getppid() << endl;
            _exit(0);
        }
    }
    while(true)
    {
        cout << "i am father process, pid: " << getpid() << endl;
        sleep(1);
    }
    return 0;
}





// volatile int flag = 0;
// void handler(int signum)
// {
//     cout << "flag 0 to 1 " << endl;
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);
//     //在优化条件下，flag可能会被优化到寄存器中
//     while(!flag);
//     cout << "process quit normal" << endl;
//     return 0;
// }

// void PrintPending()
// {
//     sigset_t set;
//     memset(&set, 0, sizeof(set));
//     sigpending(&set);
//     for (int i = 31; i >= 1; --i)
//     {
//         if (sigismember(&set, i))
//         {
//             cout << '1';
//         }
//         else
//         {
//             cout << '0';
//         }
//     }
//     cout << endl;
// }
// void handler(int signum)
// {
//     cout << "catch a sig: " << signum << endl;
//     while(true)
//     {
//         PrintPending();
//         sleep(1);
//     }
// }




// int main()
// {
//     // struct sigaction sa;
//     // struct sigaction osa;

//     // memset(&sa, 0, sizeof(sa));
//     // memset(&osa, 0, sizeof(osa));
//     // sa.sa_handler = handler;
//     // sigset_t mask;
//     // memset(&mask, 0, sizeof(mask));
//     // sigaddset(&mask, 1);
//     // sigaddset(&mask, 3);
//     // sigaddset(&mask, 4);
//     // sigaddset(&mask, 5);

//     // sa.sa_mask = mask;
//     // sigaction(2, &sa, &osa);

//     signal(2, handler);
//     while (true)
//     {
//         cout << "i am a process : " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }





// int main()
// {
//     int a = 10;
//     a /= 0;
//     cout << "a: " << a << endl;
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt = 500;
//         while(cnt)
//         {
//             cout << "i am child process, pid: " << getpid() << "cnt: " << cnt-- << endl;
//             sleep(1);
//         }
//         exit(0);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     cout << " child quit info, rid: " << rid << " exit code: " <<
//     ((status >> 8) & 0xff) << " exit signal: " <<
//     (status & 0x7f) << " core dump: " << (status >> 7 & 1) << endl;
//     return 0;
// }

// void work()
// {
//     cout << "print a log..." << endl;
// }
// void handler(int signum)
// {
//     cout << "get a sig : " << signum << endl;
//     work();
//     int n = alarm(5);
//     cout << "闹钟剩余时间: " << n << endl;
// }

// int main()
// {
//     signal(SIGALRM, handler);
//     alarm(5);
//     while(1)
//     {
//         cout << "i am a process pid : " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }
// int main()
// {
//     signal(SIGSEGV, handler);
//     cout << "before" << endl;
//     sleep(1);
//     int *p = nullptr;
//     *p = 30;
//     cout << "after" << endl;
//     return 0;
// }

// int main()
// {
//     signal(SIGFPE, handler);
//     cout << "zero before" << endl;
//     sleep(1);
//     int a = 10;
//     cout << 10 / 0 << endl;;
//     cout << "zero after" << endl;

//     return 0;
// }

// static void Usage(const string& cmd)
// {
//     cout << "\n\r " << cmd << " signo process " << endl << endl;
// }
// void handler(int signum)
// {
//     cout << "get a sig : " << signum << endl;
// }
// int main(int argc, char* argv[])
// {
//     // if(argc != 3)
//     // {
//     //     Usage(argv[0]);
//     //     exit(1);
//     // }
//     // int sig = stoi(argv[1]);
//     // pid_t id = stoi(argv[2]);
//     // int ret = kill(id, sig);
//     // if(ret == -1)
//     // {
//     //     perror("kill");
//     //     exit(2);
//     // }
//     signal(6, handler);
//     for(int i = 0; i < 3; ++i)
//     {
//         cout << "i am a process pid: " << getpid() << endl;
//         sleep(1);
//     }
//     abort();

//     return 0;
// }
